/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.bitoon.basketdudes.ws;

import com.bitoon.basketdudes.jpa.*;
import java.util.*;
import javax.naming.*;
import javax.persistence.*;

import javax.servlet.http.*;
import org.apache.log4j.*;
import org.jdom.*;


/**
 * @author PacoFELC
 * 23/11/2011 - Creación de la clase para aligerar DatosEquipo
 */
public class Cartas {
    Context     initContext = null;
    Context     envContext  = null;
    Logger      log         = Logger.getLogger(DatosEquipo.class);

    public int ColocarCarta (  EntityManager p_em, Equipo p_equipo, int p_cuarto, int p_slot, int p_carta_id  ) throws ExcepcionGeneral {
log.debug("[Colocar Carta]: " + p_carta_id );
        // Comprobamos si existe en el maestro de cartas y su tamaño
        Carta carta = (Carta)p_em.find(Carta.class, p_carta_id);

        if ( carta == null)
            throw new ExcepcionGeneral( -2, "Carta no existe"  );

        // Guardamos en el mazo
        Mazo mazo = new Mazo ();

        MazoPK pk = new MazoPK();
        pk.setEquipoId      (p_equipo.getId());
        pk.setCuarto        (p_cuarto);
        pk.setSlot          (p_slot);

        mazo.setMazoPK      (pk);
        mazo.setCarta       (carta);
        p_em.persist        (mazo);

        /* La quitamos del inventario */
        //CartaEquipo


        return carta.getCuartos();
    }

    /* Saca una carta del inventario del equipo */
    /* SOLO si en el mazo hay más cartas que en el inventario se borran las necesarias de dicho mazo */
    /* No tiene en cuenta el slot donde se encuentra dicha carta empieza por el primer slot*/
    public int sacarCartaInventario ( EntityManager em, int p_equipo_id, int p_carta_id, int p_unidades) throws ExcepcionGeneral
    {
        int error=0;

        CartaEquipo     carta_quitar;
        CartaEquipoPK   carta_quitar_pk;

        Query q3 = em.createNamedQuery("CartaEquipo.findByEquipoIdCartaId");
        q3.setParameter("equipoId"  , p_equipo_id   );
        q3.setParameter("cartaId"   ,p_carta_id     );

        List<CartaEquipo> lista_carta = q3.getResultList();
        if (lista_carta.isEmpty()) {
log.debug("[TRAZA][EQUIPO NO TIENE LA CARTA]:" + p_carta_id + " eq " + p_equipo_id );
            throw new ExcepcionGeneral( -3, "El equipo no tiene la carta" );
        } else {
log.debug("[TRAZA][SACAR_CARTA_INVENTARIO]:" + p_carta_id  );

            /* Actualizo Armario */
            carta_quitar = lista_carta.get(0);
            short cantidad = carta_quitar.getCantidad();

            if ( carta_quitar.getCantidad() < p_unidades) {
                throw new ExcepcionGeneral( -14, "El equipo no tiene suficientes unidades de la carta" );
            }

            cantidad -= (short) p_unidades;

log.debug("[TRAZA][CANTIDAD]:" + cantidad );
            if (cantidad == 0)
                em.remove(carta_quitar);
            else
                carta_quitar.setCantidad(cantidad);

            /* Buscamos si hay slots sin cubrir del mazo con las existencias de cartas para borrarlos */
            Query q_mazo = em.createNamedQuery("Mazo.findByEquipoIdCartaId");
            q_mazo.setParameter("equipoId", p_equipo_id );
            q_mazo.setParameter("cartaId", carta_quitar.getCarta().getId());

            List<Mazo> lista_mazo = q_mazo.getResultList();
            if (lista_mazo.isEmpty() == false && lista_mazo.size()>cantidad) {
                // borro cartas del mazo
                int borrar = lista_mazo.size() - cantidad;

                for ( int i=0;i<borrar; i++) {
                    em.remove(lista_mazo.get(i));

log.debug("[TRAZA][BORRANDO SLOT DE MAZO ]:" + lista_mazo.get(i).getMazoPK().getEquipoId()+ " Q: " +
            lista_mazo.get(i).getMazoPK().getCuarto() + " S:" +lista_mazo.get(i).getMazoPK().getSlot() + " CARTA:" + lista_mazo.get(i).getCarta() );
                }
            }

        }
        return error;
    }

/* Elimina del Inventario las cartas que ha gastado un equipo durante un partido
            carta_id|cantidad|carta_id2|cantidad2...|carta_idN|cantidadN
            Cartas gastadas (casa y visitante):
            &cc=carta_id|cantidad|carta_id2|cantidad2...|carta_idN|cantidadN
            &cv=carta_id|cantidad|carta_id2|cantidad2...|carta_idN|cantidadN*/
    void ConsumirCartasPartido ( EntityManager em, Equipo p_equipo, String p_linea ) throws ExcepcionGeneral{

        if ( p_linea == null || p_linea.length() == 0)
            return;
        StringTokenizer tokens = new StringTokenizer(p_linea,"|");
        while(tokens.hasMoreTokens()){
            int carta_id = Integer.parseInt(tokens.nextToken());
            int unidades = Integer.parseInt(tokens.nextToken());
log.debug("Equipo"+ p_equipo.getId() + " sacando " + carta_id + " unidades " + unidades);
            sacarCartaInventario ( em, p_equipo.getId(), carta_id, unidades);

        }
    }

}
